package com.gscitysfy.cus.drain.modules.template.service.impl;

import com.alibaba.cloud.commons.lang.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gscitysfy.cus.drain.constants.DicConstant;
import com.gscitysfy.cus.drain.constants.RedisKeyConstant;
import com.gscitysfy.cus.drain.modules.reserveplan.entity.DrainReservePlanInfo;
import com.gscitysfy.cus.drain.modules.template.entity.DrainTemplateInfo;
import com.gscitysfy.cus.drain.modules.template.mapper.DrainTemplateInfoMapper;
import com.gscitysfy.cus.drain.modules.template.service.IDrainTemplateInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gscitysfy.cus.drain.modules.template.vo.DrainTemplateInfoVo;
import com.gscitysfy.cus.drain.utils.RedisUtil;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author shenglin
 * @since 2022-11-16 14:09:26
 */
@Service
public class DrainTemplateInfoServiceImpl extends ServiceImpl<DrainTemplateInfoMapper, DrainTemplateInfo> implements IDrainTemplateInfoService {


    @Autowired
    DrainTemplateInfoMapper drainTemplateInfoMapper;

    @Resource
    private RedisUtil redisUtil;

    @Override
    @Transactional(rollbackFor = Throwable.class)
    public boolean deleteTemplateInfo(List<String> ids) {
        List<DrainTemplateInfo> old=new ArrayList<>();
        for (String infoId : ids) {
            DrainTemplateInfo drainTemplateInfo = drainTemplateInfoMapper.selectById(infoId);
            drainTemplateInfo.setCmUsable(true);
            old.add(drainTemplateInfo);
        }
        return this.updateBatchById(old);
    }

    @Override
    public IPage<DrainTemplateInfo> getTemplateInfoList(DrainTemplateInfoVo drainTemplateInfo) {
        LambdaQueryWrapper<DrainTemplateInfo> queryWrapper = new LambdaQueryWrapper<>();
        // 查询条件模板种类,险情模板和调度指令模板
        if (StringUtils.isNotEmpty(drainTemplateInfo.getTemplateKind())) {
            queryWrapper.eq(DrainTemplateInfo::getTemplateKind, drainTemplateInfo.getTemplateKind());
        }
        // 模板类型
        if (StringUtils.isNotEmpty(drainTemplateInfo.getTemplateType())) {
            queryWrapper.eq(DrainTemplateInfo::getTemplateType, drainTemplateInfo.getTemplateType());
        }
        // 模板启用状态
        if (StringUtils.isNotEmpty(drainTemplateInfo.getTemplateStatus())) {
            queryWrapper.eq(DrainTemplateInfo::getTemplateStatus, drainTemplateInfo.getTemplateStatus());
        }
        //模板名称模糊查询
        if (StringUtils.isNotEmpty(drainTemplateInfo.getTemplateName())) {
            queryWrapper.like(DrainTemplateInfo::getTemplateName, drainTemplateInfo.getTemplateName());
        }
        //模板内容描述模糊查询
        if (StringUtils.isNotEmpty(drainTemplateInfo.getTemplateDesc())) {
            queryWrapper.like(DrainTemplateInfo::getTemplateDesc, drainTemplateInfo.getTemplateDesc());
        }
        // 模板添加开始时间
        if (Objects.nonNull(drainTemplateInfo.getCmStartAddTime())) {
            queryWrapper.ge(DrainTemplateInfo::getCmAddtime, drainTemplateInfo.getCmStartAddTime());
        }
        // 模板添加结束时间
        if (Objects.nonNull(drainTemplateInfo.getCmEndAddTime())) {
            queryWrapper.le(DrainTemplateInfo::getCmAddtime, drainTemplateInfo.getCmEndAddTime());
        }
        //根据模板添加时间倒序
        queryWrapper.orderByDesc(DrainTemplateInfo::getCmAddtime);
        queryWrapper.eq(DrainTemplateInfo::getCmUsable,false);
        return this.page(new Page<>(drainTemplateInfo.getCurrent(), drainTemplateInfo.getSize()), queryWrapper);
    }

    @Override
    public String getInfoByTemplate(String templateId, String warnType, String warnAddress, String discoveryTime) {
        if(StringUtils.isNotBlank(templateId)){
            DrainTemplateInfo drainTemplateInfo = drainTemplateInfoMapper.selectById(templateId);
            //判断当前模板是否为险情模板
            if(DicConstant.WARN_TEMPLATE_TYPE.equals(drainTemplateInfo.getTemplateKind())){
                if(StringUtils.isNotBlank(drainTemplateInfo.getTemplateDesc())){
                    //缓存中获取风险类别名称
                    Map<Object, Object> problemBasis = redisUtil.hmget(RedisKeyConstant.DATA_DICT_KEY + DicConstant.COMMAND_DANGER_CATEGORY);
                    if(problemBasis.get(warnType)!=null){
                        warnType=problemBasis.get(warnType).toString();
                    }
                    return drainTemplateInfo.getTemplateDesc().replace("[风险类别]",warnType).replace("[险情地址]",warnAddress).replace("[发现时间]",discoveryTime);
                }
            }else {
                return drainTemplateInfo.getTemplateDesc();
            }

        }
        return "";
    }
}
